﻿using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Middleware.Test
{
    [TestClass]
    public class ConexaoAUmBancoParadox
    {
        private string _diretorioDasTabelasParadox;

        [TestInitialize]
        public void ConfigurarAmbienteDoTeste()
        {
            _diretorioDasTabelasParadox = @"D:\TEMP\Paradox\";
        }

        [TestMethod]
        public void ConectarEVerificarSeConectou()
        {
            // arrange
            using (var conexao = ObterConexaoAoBanco())
            {
                // act
                conexao.Open();
                var estadoDaConexaoAberta = conexao.State;
                conexao.Close();
                var estadoDaConexaoFechada = conexao.State;

                // assert
                Assert.AreEqual(ConnectionState.Open, estadoDaConexaoAberta);
                Assert.AreEqual(ConnectionState.Closed, estadoDaConexaoFechada);
            }
            

        }

        [TestMethod]
        public void ConectarEVerificarSeTemPeloMenosUmaTabelaParadox()
        {
            using (var conexao = ObterConexaoAoBanco())
            {
                // arrange
                var algumaTabelaParadoxExistente = ObterONomeDeAlgumaTabelaParadoxExistenteNoLocalDefinido();
                var nomeDoArquivoParadox = algumaTabelaParadoxExistente.Substring(algumaTabelaParadoxExistente.LastIndexOf("\\") + 1);
                var consultaTodasTabelasQuery = string.Format("select * from {0}", nomeDoArquivoParadox);

                var consultaTodasTabelasCommand = new OleDbCommand(consultaTodasTabelasQuery, conexao);

                conexao.Open();

                // act
                var leitor = consultaTodasTabelasCommand.ExecuteReader();
                string dadoDaPrimeiraColuna = null;

                while (leitor != null && leitor.Read())
                {
                    dadoDaPrimeiraColuna = leitor[0].ToString();
                    Console.WriteLine("Dado da primeira coluna: {0}", dadoDaPrimeiraColuna);
                    break;
                }
                conexao.Close();

                // assert
                Assert.IsNotNull(dadoDaPrimeiraColuna);
            }
        }

        private string ObterONomeDeAlgumaTabelaParadoxExistenteNoLocalDefinido()
        {
            var arquivosDoDiretorio = Directory.GetFiles(_diretorioDasTabelasParadox);

            var nomeTabelaParadoxExistente =
                arquivosDoDiretorio.Where(nome =>
                                              {
                                                  var seTemArquivoComAExtensaoParadox = nome.ToLower().IndexOf(".db", StringComparison.Ordinal) > 0;
                                                  return seTemArquivoComAExtensaoParadox;
                                              })
                                   .Select(nome => nome)
                                   .FirstOrDefault();

            var naoEncontradoArquivoComAExtensaoParadox = string.IsNullOrWhiteSpace(nomeTabelaParadoxExistente);
            if (naoEncontradoArquivoComAExtensaoParadox)
                throw new InternalTestFailureException("Não existe nenhum arquivo PARADOX no local estabelecido.",
                                                       new FileNotFoundException(
                                                           string.Format(
                                                               "Não existe o arquivo PARADOX {0} no diretório \"{1}\" informado.",
                                                               nomeTabelaParadoxExistente, _diretorioDasTabelasParadox)));

            return nomeTabelaParadoxExistente;
        }


        private OleDbConnection ObterConexaoAoBanco()
        {
            // DEU O ERRO: System.Data.OleDb.OleDbException: Especificação de autorização inválida Atributo de cadeia de caracteres de conexão inválido
            //const string conexaoAoBanco = @"Provider=SQLOLEDB;Driver={Microsoft Paradox Driver (*.db )};DriverID=538;Fil=Paradox 5.X;DefaultDir=D:\TEMP\Paradox\;Dbq=D:\TEMP\Paradox\;CollatingSequence=ASCII;";

            // DEU O ERRO: System.Data.OleDb.OleDbException: Especificação de autorização inválida Atributo de cadeia de caracteres de conexão inválido
            //const string conexaoAoBanco = @"Provider=SQLOLEDB;Driver={Microsoft Paradox Driver (*.db )};DriverID=538;Fil=Paradox 5.X;DefaultDir=D:\TEMP\Paradox\;Dbq=D:\TEMP\Paradox\;CollatingSequence=ASCII;";

            string conexaoAoBanco = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Paradox 5.x;", _diretorioDasTabelasParadox);

            var conexao = new OleDbConnection()
                              {
                                  ConnectionString = conexaoAoBanco
                              };

            return conexao;
        }
    }
}
